Published on January 17, 2025

返回

#include <bits/stdc++.h>
using namespace std;
#define fast ios ::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
typedef long long ll;
#define REP(i, s, e) for (int i = (s); i < (e); ++i)
#define OUT(v) for (int k = 0; k < v.size(); ++k) cout << v[k] << ' '; cout << endl;
const int N = 1e5 + 10;
int h[N], e[2 * N], ne[N];

int n, m, q;
// int g[8];
// int jh[8][8];
vector<int> g;
vector<vector<int>> jh;
int sum = 0;
int sz = 0;  // m 个 1的大小

vector<int> path;
vector<int> rs(100);
int ten(string s) { // 压缩, 传入01字符串压缩为二进制的int
    int res = 0, len = s.size();
    for (int i = 0; i < len; i++) {
        if (s[i] == '1') {
            res += pow(2, len - i - 1);
        }
    }
    return res;
}

bool ck(vector<int> &tg) {
    for (int i = 1; i <= n; i++) {
        if ((tg[i] ^ g[i]) != sz) return false; // tg[i] ^ g[i]要加小括号的, 
    }
    return true;
}

void dfs(int u, vector<int> tg) {
    if (u == q) { // 选择了q次
        if (ck(tg) && path.size() < rs.size()) {
            rs = path;
        }
        return;
    }
    for (int i = 0; i <= 1; i++) { // 0-1的顺序, tg可以不回溯, 1-0就得回溯了
        if (i == 0) {
            dfs(u + 1, tg);
        }
        else {
            int k = u + 1;
            vector<int> ttg = tg;
            for (int j = 1; j <= n; j++) {
                tg[j] = (tg[j] | jh[k][j]);
            }
            path.push_back(k);
            dfs(u + 1, tg);
            tg = ttg;
            path.pop_back();
        }
    }
}

void solve() {
    cin >> n >> m >> q;
    g.resize(n + 1), jh.resize(q + 1, vector<int> (n + 1));
    sz = int(pow(2, m) - 1);
    for (int i = 1; i <= n; i++) {
        string s;
        cin >> s;
        g[i] = ten(s);
    }
    for(int k = 1; k <= q; k++) {
        for (int i = 1; i <= n; i++) {
            string s;
            cin >> s;
            jh[k][i] = ten(s);
        }
    }
    vector<int> tg(n + 1);
    dfs(0, tg);
    if (rs.size() == 100) {
        cout << -1;
    }
    else {
        cout << rs.size() << endl;
        OUT(rs);
    }
}

int main() {
    solve();
}